/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.unesp.demac.bcc.soo.dao;

import br.unesp.demac.bcc.soo.bean.Dvd;
import br.unesp.demac.bcc.soo.bean.Modalidade;
import br.unesp.demac.bcc.soo.bean.Pessoa;
import br.unesp.demac.bcc.soo.util.FabricaConexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

/**
 *
 * @author flavioam
 */
public class DvdDAOImp implements DvdDAO {

    @Override
    public int salvaDvd(Dvd d) throws Exception {

        int idDvd = -1;
        Connection con = null;

        try {

            con = FabricaConexao.getConexao();

            String sql = "insert into Dvds (nome, classificacao, genero, dataCadastro, Modalidades_idModalidades) values (?,?,?,?,?)";

            PreparedStatement pstmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

            pstmt.setString(1, d.getNome());
            pstmt.setInt(2, d.getClassificacao());
            pstmt.setString(3, d.getGenero());
            pstmt.setDate(4, new java.sql.Date(d.getDataCadastro().getTime()));
            pstmt.setInt(5, d.getModalidade().getIdModalidade());

            pstmt.executeUpdate();

            ResultSet rs = pstmt.getGeneratedKeys();
            rs.next();

            idDvd = rs.getInt(1);

        } catch (SQLException e) {

            throw new Exception("Erro ao inserir dvd: " + e.getMessage());

        } finally {
            FabricaConexao.fechar(con);
        }
        return idDvd;
    }

    @Override
    public Dvd selecionaDvdById(int id) throws Exception {

        Dvd d = null;
        Connection con = null;

        try {

            con = FabricaConexao.getConexao();

            String sql = "select * from Dvds where idDvds = ?";

            PreparedStatement pstmt = con.prepareStatement(sql);

            pstmt.setInt(1, id);

            ResultSet rs = pstmt.executeQuery();

            if (rs.next()) {

                d = new Dvd();

                d.setClassificacao(rs.getInt("classificacao"));
                d.setDataCadastro(new java.util.Date(rs.getDate("dataCadastro").getTime()));
                d.setGenero(rs.getString("genero"));
                d.setIdDvd(rs.getInt("idDvds"));
                d.setNome(rs.getString("nome"));

                ModalidadeDAO mDao = new ModalidadeDAOImp();
                Modalidade m = mDao.selecionaModalidadeById(rs.getInt("Modalidades_idModalidades"));

                d.setModalidade(m);
            }

        } catch (SQLException e) {

            throw new Exception("Erro ao selecionar dvd: " + e.getMessage());

        } finally {
            FabricaConexao.fechar(con);
        }
        return d;
    }

    @Override
    public boolean deletaDvd(Dvd d) throws Exception {

        boolean updated = false;
        Connection con = null;

        try {

            con = FabricaConexao.getConexao();

            String sql = "delete from Dvds where idDvds = ?";

            PreparedStatement pstmt = con.prepareStatement(sql);

            pstmt.setInt(1, d.getIdDvd());

            pstmt.executeUpdate();

            updated = true;

        } catch (SQLException e) {

            throw new Exception("Erro ao excluir dvd: " + e.getMessage());

        } finally {
            FabricaConexao.fechar(con);
        }
        return updated;
    }

    @Override
    public boolean editaDvd(Dvd d) throws Exception {

        boolean updated = false;
        Connection con = null;

        try {

            con = FabricaConexao.getConexao();

            String sql = "update Dvds set nome = ?, classificacao = ?, genero = ?, dataCadastro = ? where idDvds = ?";

            PreparedStatement pstmt = con.prepareStatement(sql);

            pstmt.setString(1, d.getNome());
            pstmt.setInt(2, d.getClassificacao());
            pstmt.setString(3, d.getGenero());
            pstmt.setDate(4, new java.sql.Date(d.getDataCadastro().getTime()));
            pstmt.setInt(5, d.getIdDvd());

            pstmt.executeUpdate();

            updated = true;

        } catch (SQLException e) {

            throw new Exception("Erro ao editar dvd: " + e.getMessage());

        } finally {
            FabricaConexao.fechar(con);
        }
        return updated;
    }

    @Override
    public Dvd selecionaDvdAlugadoById(int id) throws Exception {

        Dvd d = null;
        Connection con = null;

        try {

            con = FabricaConexao.getConexao();

            String sql = "select * from Dvds where idDvds = ? and idDvds in(select Dvds_idDvds from RelAlugueisDvds where dataDevolvido is null)";

            PreparedStatement pstmt = con.prepareStatement(sql);

            pstmt.setInt(1, id);

            ResultSet rs = pstmt.executeQuery();

            if (rs.next()) {

                d = new Dvd();

                d.setClassificacao(rs.getInt("classificacao"));
                d.setDataCadastro(new java.util.Date(rs.getDate("dataCadastro").getTime()));
                d.setGenero(rs.getString("genero"));
                d.setIdDvd(rs.getInt("idDvds"));
                d.setNome(rs.getString("nome"));
                d.setIdDvd(id);

                ModalidadeDAO mDao = new ModalidadeDAOImp();
                Modalidade m = mDao.selecionaModalidadeById(rs.getInt("Modalidades_idModalidades"));

                d.setModalidade(m);
            }

        } catch (SQLException e) {

            throw new Exception("Erro ao selecionar dvds alugados: " + e.getMessage());

        } finally {
            FabricaConexao.fechar(con);
        }
        return d;

    }
}
